package dao

import (
	"web08_35_tushu/model"
	"web08_35_tushu/utils"
)

//AddCartItem 数据库添加购物项
func AddCartItem(cartItem *model.CartItem) error {
	sqlStr := "insert into cart_items(count,amount,book_id,cart_id) values(?,?,?,?)"
	_, err := utils.Db.Exec(sqlStr, cartItem.Count, cartItem.GetAmount(), cartItem.Book.ID, cartItem.CartID)
	if err != nil {
		return err
	}
	return nil

}

//只查出一个购物项

//GetCartItemByBookIDAndCartID 通过图书ID和购物车ID找购物项
func GetCartItemByBookIDAndCartID(bookID string, cartID string) (*model.CartItem, error) {
	//写sql把购物项查出来
	sqlStr := "select id,count,amount,cart_id from cart_items where book_id= ? and cart_id = ?"
	row := utils.Db.QueryRow(sqlStr, bookID, cartID)
	//创建个购物项用来存放
	cartItem := &model.CartItem{}
	err := row.Scan(&cartItem.CartItemID, &cartItem.Count, &cartItem.Amount, &cartItem.CartID)
	if err != nil {
		return nil, err
	}

	//我添加了个图书查询，把图书结构体也加到购物项里补全购物项，到时候就类似递归把全部都查出来
	//用户-购物车-购物项-图书，最终图书再返回，一步一步全部返回回去组成完整的购物车
	book, err := GetBookByID(bookID)
	if err != nil {
		return nil, err
	}
	cartItem.Book = book
	return cartItem, nil
}

//查出所有购物项

//GetCartItemsByCartID 根据购物车的ID获取购物车所有购物项,最终返回一个购物项切片
func GetCartItemsByCartID(cartID string) ([]*model.CartItem, error) {
	//把全部的购物项查出来
	sqlStr := "select id,count,amount,book_id,cart_id from cart_items where cart_id = ?"
	rows, err := utils.Db.Query(sqlStr, cartID)
	if err != nil {
		return nil, err
	}
	//创建个切片存放购物项，最终返回的也是这个切片
	var cartItems []*model.CartItem
	for rows.Next() {
		//创建个购物项存放单个购物项数据
		cartItem := &model.CartItem{}
		//定义个bookID用来放图书id，方便下面的查询图书
		var bookID string
		err2 := rows.Scan(&cartItem.CartItemID, &cartItem.Count, &cartItem.Amount, &bookID, &cartItem.CartID)
		if err != nil {
			return nil, err2
		}
		//查询图书，获取图书结构体
		book, err := GetBookByID(bookID)
		if err != nil {
			return nil, err
		}
		//最终把图书结构体放入单个购物项中
		cartItem.Book = book
		//把单个购物项放入切片
		cartItems = append(cartItems, cartItem)
	}
	//最终返回购物项切片，这个切片就是完整的切片
	return cartItems, nil
}

//UpdateBookCountAndAmount 更新图书数量，根据购物车ID和图书ID找到图书并更新图书数量
func UpdateBookCountAndAmount(bookCount int64, amount float64, bookID int, cartID string) error {
	sql := "update cart_items set count = ? , amount = ? where book_id = ? and cart_id = ?"
	_, err := utils.Db.Exec(sql, bookCount, amount, bookID, cartID)
	if err != nil {
		return err
	}
	return nil
}

//DeleteCartItemsByCartID 删除购物项，通过购物车ID删除所有购物项
func DeleteCartItemsByCartID(cartID string) error {
	sql := "delete from cart_items where cart_id = ?"
	_, err := utils.Db.Exec(sql, cartID)
	if err != nil {
		return err
	}
	return nil
}

//DeleteCartItemByID 删除购物项，通过购物项ID及购物车ID删除购物项
func DeleteCartItemByID(cartItemID string, cartID string) error {
	//之所以加个购物车ID是防止越权删除，毕竟购物项ID是前端传过来用户可控的
	sql := "delete from cart_items where id = ? and cart_id = ?"
	_, err := utils.Db.Exec(sql, cartItemID, cartID)
	if err != nil {
		return err
	}
	return nil
}

//UpdateBookCount 删除购物项，通过购物项ID及购物车ID删除购物项，其实这里购物车ID用购物项里的也行
func UpdateBookCount(cartItem *model.CartItem, cartID string) error {
	//之所以加个购物车ID是防止越权删除，毕竟购物项ID是前端传过来用户可控的
	sql := "update cart_items set count = ? ,amount = ? where id = ? and cart_id = ?"
	_, err := utils.Db.Exec(sql, cartItem.Count, cartItem.GetAmount(), cartItem.CartItemID, cartID)
	if err != nil {
		return err
	}
	return nil
}
